feat(studio): DataDesigner details profiler results#428
feat(studio): DataDesigner details profiler results#428steramae-nvidia wants to merge 2 commits into
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (14)
✅ Files skipped from review due to trivial changes (1)
🚧 Files skipped from review as they are similar to previous changes (13)
📝 WalkthroughWalkthroughAdds dataset profiler types and UI, builder config parsing and a config panel, shared job/fileset hooks, tabbed job-details wiring, and a default build model constant update. ChangesData Designer Job Details Feature Expansion
Default build model update
Sequence Diagram(s)sequenceDiagram
participant DataDesignerJobDetailsRoute
participant useDataDesignerJobFromRoute
participant DatasetProfilerSection
participant useDataDesignerJobAnalysis
participant JobOutputFilesetSection
participant useDataDesignerArtifactsFileset
participant DataDesignerConfigPanel
participant useDatasetFileContent
DataDesignerJobDetailsRoute->>useDataDesignerJobFromRoute: load workspace, jobName, job
useDataDesignerJobFromRoute->>useDataDesignerGetCreateJob: fetch job status
DataDesignerJobDetailsRoute->>DatasetProfilerSection: render Profile tab
DatasetProfilerSection->>useDataDesignerJobAnalysis: load analysis result
useDataDesignerJobAnalysis->>useDataDesignerListCreateJobResults: list create job results
DataDesignerJobDetailsRoute->>JobOutputFilesetSection: render Output files tab
JobOutputFilesetSection->>useDataDesignerArtifactsFileset: resolve artifacts fileset
useDataDesignerArtifactsFileset->>useDataDesignerListCreateJobResults: list create job results
useDataDesignerArtifactsFileset->>useFilesListFilesetFiles: list files in fileset
DataDesignerJobDetailsRoute->>DataDesignerConfigPanel: open config side panel
DataDesignerConfigPanel->>useDataDesignerArtifactsFileset: read builder config file
DataDesignerConfigPanel->>useDatasetFileContent: fetch file content
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 6
🧹 Nitpick comments (4)
web/packages/studio/src/routes/DataDesignerJobDetailsRoute/builderConfig.ts (1)
17-44: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winMark summary interface fields as readonly.
These interfaces represent parsed summary snapshots and should be immutable at the type level.
Proposed diff
export interface BuilderConfigColumnSummary { - name: string; - type: string; - modelAlias?: string; + readonly name: string; + readonly type: string; + readonly modelAlias?: string; } export interface BuilderConfigModelSummary { - alias: string; - model: string; - provider?: string; + readonly alias: string; + readonly model: string; + readonly provider?: string; } export interface BuilderConfigSeedSummary { - type: string; - samplingStrategy?: string; + readonly type: string; + readonly samplingStrategy?: string; } export interface BuilderConfigSummary { - columnCount: number; - columns: BuilderConfigColumnSummary[]; - columnTypeBreakdown: Array<{ type: string; count: number }>; - models: BuilderConfigModelSummary[]; - seed?: BuilderConfigSeedSummary; - constraintCount: number; - profilerCount: number; - processorNames: string[]; - libraryVersion?: string; + readonly columnCount: number; + readonly columns: BuilderConfigColumnSummary[]; + readonly columnTypeBreakdown: Array<{ type: string; count: number }>; + readonly models: BuilderConfigModelSummary[]; + readonly seed?: BuilderConfigSeedSummary; + readonly constraintCount: number; + readonly profilerCount: number; + readonly processorNames: string[]; + readonly libraryVersion?: string; }As per coding guidelines:
web/**/*.{ts,tsx}: Use \readonly` for immutable properties in TypeScript interfaces and types`.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/src/routes/DataDesignerJobDetailsRoute/builderConfig.ts` around lines 17 - 44, Add the readonly keyword to all property declarations in the four summary interfaces (BuilderConfigColumnSummary, BuilderConfigModelSummary, BuilderConfigSeedSummary, and BuilderConfigSummary) to mark them as immutable at the type level. For each property in these interfaces, prefix the property name with the readonly keyword to ensure the data structures represent immutable snapshots that cannot be modified after creation.Source: Coding guidelines
web/packages/studio/src/routes/DataDesignerJobDetailsRoute/DataDesignerConfigPanel.tsx (1)
14-14: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winImport
FCas type-only.
FCis only used in type positions here.Proposed diff
-import { FC, useMemo } from 'react'; +import { useMemo, type FC } from 'react';As per coding guidelines:
web/**/*.{ts,tsx}: Use \import type` for type-only imports in TypeScript`.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/src/routes/DataDesignerJobDetailsRoute/DataDesignerConfigPanel.tsx` at line 14, The import statement at the top of DataDesignerConfigPanel.tsx imports both FC and useMemo from 'react' using a single import statement. Since FC is only used in type positions (as a functional component type), it should be imported using import type syntax instead of regular import. Split the import statement so that FC is imported with import type while useMemo remains in a regular import statement.Source: Coding guidelines
web/packages/studio/src/routes/DataDesignerJobDetailsRoute/JobOutputFilesetSection.tsx (1)
20-20: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winConvert type-only React imports to
import type.
ComponentPropsandFCare type-only and should useimport typein this TSX file.Proposed fix
-import { ComponentProps, FC, useCallback, useEffect, useMemo, useState } from 'react'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import type { ComponentProps, FC } from 'react';As per coding guidelines,
web/**/*.{ts,tsx}: Useimport typefor type-only imports in TypeScript.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/src/routes/DataDesignerJobDetailsRoute/JobOutputFilesetSection.tsx` at line 20, In the import statement at the top of JobOutputFilesetSection.tsx, separate the type-only imports from the runtime imports. Move ComponentProps and FC to a new line using import type syntax, keeping useCallback, useEffect, useMemo, and useState in the regular import statement from React. This ensures type-only imports are clearly distinguished from runtime dependencies according to the project's TypeScript guidelines.Source: Coding guidelines
web/packages/studio/src/routes/DataDesignerJobDetailsRoute/index.tsx (1)
25-25: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winUse
import typeforFCin this TSX module.
FCis type-only and should be imported withimport typeto match the TypeScript guideline.Proposed fix
-import { FC, useState } from 'react'; +import { useState } from 'react'; +import type { FC } from 'react';As per coding guidelines,
web/**/*.{ts,tsx}: Useimport typefor type-only imports in TypeScript.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/src/routes/DataDesignerJobDetailsRoute/index.tsx` at line 25, The import statement at the top of the DataDesignerJobDetailsRoute file imports FC as a type-only import along with useState in a single import statement. Separate this into two imports: create a type-only import for FC using import type, and keep a regular import for useState from react. This ensures that type-only imports are explicitly marked as such, following TypeScript guidelines that help with tree-shaking and code clarity.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@web/packages/studio/src/routes/DataDesignerJobDetailsRoute/DataDesignerConfigPanel.tsx`:
- Around line 59-63: The key prop for the mapped KVPair components uses only
model.alias and column.name respectively, which can collide when duplicate
aliases or names exist (such as multiple "(unnamed)" entries), causing React to
mis-reconcile elements. Replace the key prop in both the model mapping (around
line 59-63 in the summary.models.map) and the column mapping (around line 75-79)
with a stable unique identifier that includes both the alias/name and the array
index, or another property that ensures uniqueness across duplicates, to prevent
reconciliation issues.
In
`@web/packages/studio/src/routes/DataDesignerJobDetailsRoute/DatasetProfilerSection.tsx`:
- Around line 57-67: The loading state condition in the first if statement is
checking hasAnalysis instead of the actual analysis data, which causes the
empty-state message to appear when hasAnalysis is true but the data is still
loading. Change the condition from checking !hasAnalysis to checking !analysis
(or checking if analysis is falsy/undefined) to properly gate the skeleton
loading state. This ensures the skeleton loader displays whenever data is
actually still loading, regardless of the hasAnalysis flag status. The fix
applies to the loading branch condition at the beginning of this component
logic.
In
`@web/packages/studio/src/routes/DataDesignerJobDetailsRoute/datasetProfilerTypes.ts`:
- Around line 148-153: The getPercentComplete function can return values above
100 or below 0 due to backend count drift, which breaks progress rendering in
consumers expecting valid percentage values. Clamp the calculated percentage
result to the range [0, 100] by wrapping the return statement with Math.max(0,
Math.min(100, ...)) to ensure the function always returns a value between 0 and
100 inclusive.
- Around line 136-137: The type predicate isLLMColumnStatistics narrows to only
LLMTextColumnStatistics, but the runtime check using LLM_COLUMN_TYPES actually
validates against four different LLM column types (llm-text, llm-code,
llm-structured, and llm-judge). Create a union type that includes all four LLM
column statistic variants, then update the return type of the
isLLMColumnStatistics predicate to use this union type instead of
LLMTextColumnStatistics to align the type guard with the actual runtime
behavior.
In
`@web/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerArtifactsFileset.ts`:
- Around line 26-29: The useDataDesignerListCreateJobResults hook call is not
capturing error information from its response. Currently when the hook fails,
it's being treated identically to the case where there are simply no results,
causing incorrect error messages to display downstream. Extract the error state
that the hook returns (in addition to the data and isLoading states already
being destructured) and ensure this error state is used by downstream code to
properly render an error state instead of conflating it with empty results.
Apply this same fix to all usages of useDataDesignerListCreateJobResults
including the location at lines 74-89.
In
`@web/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerJobAnalysis.ts`:
- Around line 33-36: The useDataDesignerJobAnalysis hook is not capturing errors
from the useDataDesignerListCreateJobResults query call. When the results
listing fails, the hook currently reports hasAnalysis as false and isError as
false, misclassifying backend failures as missing analysis. Extract the error
state from the useDataDesignerListCreateJobResults destructuring (similar to how
data and isLoading are extracted) and incorporate it into the hook's return
value so that actual backend errors are properly surfaced to consumers rather
than being silently dropped.
---
Nitpick comments:
In `@web/packages/studio/src/routes/DataDesignerJobDetailsRoute/builderConfig.ts`:
- Around line 17-44: Add the readonly keyword to all property declarations in
the four summary interfaces (BuilderConfigColumnSummary,
BuilderConfigModelSummary, BuilderConfigSeedSummary, and BuilderConfigSummary)
to mark them as immutable at the type level. For each property in these
interfaces, prefix the property name with the readonly keyword to ensure the
data structures represent immutable snapshots that cannot be modified after
creation.
In
`@web/packages/studio/src/routes/DataDesignerJobDetailsRoute/DataDesignerConfigPanel.tsx`:
- Line 14: The import statement at the top of DataDesignerConfigPanel.tsx
imports both FC and useMemo from 'react' using a single import statement. Since
FC is only used in type positions (as a functional component type), it should be
imported using import type syntax instead of regular import. Split the import
statement so that FC is imported with import type while useMemo remains in a
regular import statement.
In `@web/packages/studio/src/routes/DataDesignerJobDetailsRoute/index.tsx`:
- Line 25: The import statement at the top of the DataDesignerJobDetailsRoute
file imports FC as a type-only import along with useState in a single import
statement. Separate this into two imports: create a type-only import for FC
using import type, and keep a regular import for useState from react. This
ensures that type-only imports are explicitly marked as such, following
TypeScript guidelines that help with tree-shaking and code clarity.
In
`@web/packages/studio/src/routes/DataDesignerJobDetailsRoute/JobOutputFilesetSection.tsx`:
- Line 20: In the import statement at the top of JobOutputFilesetSection.tsx,
separate the type-only imports from the runtime imports. Move ComponentProps and
FC to a new line using import type syntax, keeping useCallback, useEffect,
useMemo, and useState in the regular import statement from React. This ensures
type-only imports are clearly distinguished from runtime dependencies according
to the project's TypeScript guidelines.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 63a66446-24f0-4fc3-a33c-ef9c32f8b383
📒 Files selected for processing (14)
web/packages/studio/src/constants/constants.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/CategoricalHistogramChart.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/ColumnProfileCard.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/DataDesignerConfigPanel.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/DatasetProfilerSection.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/JobOutputFilesetSection.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/builderConfig.test.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/builderConfig.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/datasetProfilerTypes.test.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/datasetProfilerTypes.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/index.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerArtifactsFileset.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerJobAnalysis.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerJobFromRoute.ts
|
405d6ae to
1d76e20
Compare
Signed-off-by: Sean Teramae <steramae@nvidia.com>
Signed-off-by: Sean Teramae <steramae@nvidia.com>
1d76e20 to
9957f2a
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@web/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsx`:
- Around line 117-137: The component has a duplicated metadataKeys memo and the
second block uses tableData, which is not defined in ExperimentGroupDataView.
Remove the stale redeclaration and keep only the existing useMemo wired to the
in-scope orderedData source so the metadata key computation stays single and
buildable.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 837c8bbd-ab1d-4656-89be-2a24d4055257
📒 Files selected for processing (15)
web/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsxweb/packages/studio/src/constants/constants.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/CategoricalHistogramChart.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/ColumnProfileCard.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/DataDesignerConfigPanel.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/DatasetProfilerSection.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/JobOutputFilesetSection.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/builderConfig.test.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/builderConfig.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/datasetProfilerTypes.test.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/datasetProfilerTypes.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/index.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerArtifactsFileset.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerJobAnalysis.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerJobFromRoute.ts
💤 Files with no reviewable changes (14)
- web/packages/studio/src/constants/constants.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/CategoricalHistogramChart.tsx
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/datasetProfilerTypes.test.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerJobFromRoute.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/builderConfig.test.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerJobAnalysis.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/ColumnProfileCard.tsx
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/builderConfig.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/DataDesignerConfigPanel.tsx
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/DatasetProfilerSection.tsx
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/datasetProfilerTypes.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/index.tsx
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerArtifactsFileset.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/JobOutputFilesetSection.tsx
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@web/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsx`:
- Around line 117-137: The component has a duplicated metadataKeys memo and the
second block uses tableData, which is not defined in ExperimentGroupDataView.
Remove the stale redeclaration and keep only the existing useMemo wired to the
in-scope orderedData source so the metadata key computation stays single and
buildable.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 837c8bbd-ab1d-4656-89be-2a24d4055257
📒 Files selected for processing (15)
web/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsxweb/packages/studio/src/constants/constants.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/CategoricalHistogramChart.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/ColumnProfileCard.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/DataDesignerConfigPanel.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/DatasetProfilerSection.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/JobOutputFilesetSection.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/builderConfig.test.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/builderConfig.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/datasetProfilerTypes.test.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/datasetProfilerTypes.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/index.tsxweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerArtifactsFileset.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerJobAnalysis.tsweb/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerJobFromRoute.ts
💤 Files with no reviewable changes (14)
- web/packages/studio/src/constants/constants.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/CategoricalHistogramChart.tsx
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/datasetProfilerTypes.test.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerJobFromRoute.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/builderConfig.test.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerJobAnalysis.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/ColumnProfileCard.tsx
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/builderConfig.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/DataDesignerConfigPanel.tsx
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/DatasetProfilerSection.tsx
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/datasetProfilerTypes.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/index.tsx
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/useDataDesignerArtifactsFileset.ts
- web/packages/studio/src/routes/DataDesignerJobDetailsRoute/JobOutputFilesetSection.tsx
🛑 Comments failed to post (1)
web/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsx (1)
117-137: 🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win
Replace the old
metadataKeysmemo instead of duplicating it.Lines 129-137 redeclare
metadataKeys, andtableDatais not defined anywhere in this component. This is a build break. Remove the stale block and keep a single memo wired to an in-scope data source.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsx` around lines 117 - 137, The component has a duplicated metadataKeys memo and the second block uses tableData, which is not defined in ExperimentGroupDataView. Remove the stale redeclaration and keep only the existing useMemo wired to the in-scope orderedData source so the metadata key computation stays single and buildable.
Summary by CodeRabbit
New Features
Bug Fixes